#ifndef __RD_CFG_H
#define __RD_CFG_H
/*
 *parameter: file_path 文件的绝对路径名如: /user/home/my.cfg
 *           key         文本中的变量名   如 num
 *           def       	对应变量的默认值
 *	     readConfig 返回string类型   readConfigFloat 返回float类型  readConfigInt 返回Int类型
 *
 */
#include <iostream>
#include <string>
#include <fstream>
#include <sstream> //使用stringstream需要引入这个头文件
using namespace std;
template <typename T>
static T getConfig(string file_path, const std::string &name, const T &defaultValue) // This name must be namespace+parameter_name
{
    T return_value;
    const char *cfgfilepath = file_path.c_str();
    fstream cfgFile;
    string value;
    cfgFile.open(cfgfilepath); // 打开文件
    if (!cfgFile.is_open()) {
        cout << "can not open cfg file!" << endl;
        return defaultValue;
    }
    char tmp[100];
    while (!cfgFile.eof()) // 循环读取每一行
    {
        cfgFile.getline(tmp, 100); // 每行读取前1000个字符，1000个应该足够了
        string line(tmp);
        size_t pos = line.find('='); // 找到每行的“=”号位置，之前是key之后是value
        if (pos == string::npos) {
            printf("No have value,return def");
            return defaultValue;
        }
        string tmpKey = line.substr(0, pos); // 取=号之前
        if (name == tmpKey) {
            value = line.substr(pos + 1); // 取=号之后
            printf("Read value %s:%s\n", name.c_str(), value.c_str());
            istringstream isa_str(value);
            isa_str >> return_value;
            return return_value;
        } else {
            return defaultValue;
        }
    }
}
static string readConfig(string file_path, const string &key, string def) {
    const char *cfgfilepath = file_path.c_str();
    fstream cfgFile;
    string value;
    string no_value = "error";
    cfgFile.open(cfgfilepath); // 打开文件
    if (!cfgFile.is_open()) {
        cout << "can not open cfg file!" << endl;
        return no_value;
    }
    char tmp[100];
    while (!cfgFile.eof()) // 循环读取每一行
    {
        cfgFile.getline(tmp, 100); // 每行读取前1000个字符，1000个应该足够了
        string line(tmp);
        size_t pos = line.find('='); // 找到每行的“=”号位置，之前是key之后是value
        if (pos == string::npos) {
            printf("No have value,return def %s:%s\n", key.c_str(), def.c_str());
            return def;
        }
        string tmpKey = line.substr(0, pos); // 取=号之前
        if (key == tmpKey) {
            value = line.substr(pos + 1); // 取=号之后
            printf("Read value %s:%s\n", key.c_str(), value.c_str());
            return value;
        }
    }
    return def;
}

static float readConfigFloat(string file_path, const string &key, float def) {
    const char *cfgfilepath = file_path.c_str();
    fstream cfgFile;
    string value;
    float no_value = -1;
    cfgFile.open(cfgfilepath); // 打开文件
    if (!cfgFile.is_open()) {
        cout << "can not open cfg file!" << endl;
        return no_value;
    }
    char tmp[100];
    while (!cfgFile.eof()) // 循环读取每一行
    {
        cfgFile.getline(tmp, 100); // 每行读取前1000个字符，1000个应该足够了
        string line(tmp);
        size_t pos = line.find('='); // 找到每行的“=”号位置，之前是key之后是value
        if (pos == string::npos) {
            printf("No have value,return def %s:%f\n", key.c_str(), def);
            return def;
        }
        string tmpKey = line.substr(0, pos); // 取=号之前
        if (key == tmpKey) {
            value = line.substr(pos + 1); // 取=号之后
            printf("Read value %s:%f\n", key.c_str(), atof(value.c_str()));
            return atof(value.c_str());
        }
    }
    return def;
}

static int readConfigInt(string file_path, const string &key, int def) {
    const char *cfgfilepath = file_path.c_str();
    fstream cfgFile;
    string value;
    int no_value = -1;
    cfgFile.open(cfgfilepath); // 打开文件
    if (!cfgFile.is_open()) {
        cout << "can not open cfg file!" << endl;
        return no_value;
    }
    char tmp[100];
    while (!cfgFile.eof()) // 循环读取每一行
    {
        cfgFile.getline(tmp, 100); // 每行读取前100个字符，100个应该足够了
        string line(tmp);
        size_t pos = line.find('='); // 找到每行的“=”号位置，之前是key之后是value
        if (pos == string::npos) {
            printf("No have value,return def %s:%d\n", key.c_str(), def);
            return def;
        }
        string tmpKey = line.substr(0, pos); // 取=号之前
        if (key == tmpKey) {
            value = line.substr(pos + 1); // 取=号之后
            printf("Read value %s:%d\n", key.c_str(), atoi(value.c_str()));
            return atoi(value.c_str());
        }
    }
    return def;
}
#endif